import time

# 共享变量，key是设备名称，value是账号
import os

from Util.log import Log

g_searchingAccount = {}



class AddFriendsWithAccount:

    def __init__(self, device):
        self.device = device

    # 点击主界面右上角的'+'按钮，显示'更多菜单'
    # private
    def showMoreMenu(self):
        from Util.log import Log
        Log.debug("显示'更多菜单'")
        if self.device(className="android.widget.RelativeLayout", description="更多功能按钮").click_exists(timeout=10.0):
            return True
        else:
            Log.debug("未找到主界面的'+'按钮")
            return False

    # 点击主界面'更多菜单'中的'添加朋友菜单'
    # private
    def clickAddFriendsMenuItem(self):
        Log.debug("开始点击主界面'更多菜单'中的'添加朋友'菜单项")

        if self.device(index=1, className="android.widget.LinearLayout", resourceId="com.tencent.mm:id/i8").click_exists(timeout=10.0):
            return True
        else:
            Log.debug("未找到'添加朋友'菜单项")
            return False

    # 显示添加朋友界面
    def showAddFriendsWindow(self):
        if self.showMoreMenu():
            time.sleep(2)
            if self.clickAddFriendsMenuItem():
                return True
            else:
                return False
        else:
            return False

    # 激活添加朋友界面，输入微信号
    # private
    def activeSearchAccountFiled(self):
        Log.debug("开始激活'添加朋友'界面中的输入框")

        if self.device(text="微信号/QQ号/手机号", className="android.widget.TextView",
                               resourceId="com.tencent.mm:id/ce2").click_exists(timeout=10.0):
            return True
        else:
            Log.error("无法激活'添加朋友'界面中的输入框")
            return False

    # 输入微信号
    # private
    def inputFriendsAccount(self, account):
        Log.debug("开始输入微信号")

        if self.device(className="android.widget.EditText",
                                resourceId="com.tencent.mm:id/hz").wait():
            uiObject = self.device(className="android.widget.EditText",
                        resourceId="com.tencent.mm:id/hz")
            uiObject.click()
            self.device.set_fastinput_ime(True)  # 切换成FastInputIME输入法
            self.device.clear_text()  # 清除输入框所有内容(Require android-uiautomator.apk version >= 1.0.7)
            self.device.send_keys(account)  # adb广播输入
            return True
        else:
            pass
        return False

    # 搜索微信号
    def searchFriendsAccount(self, account):
        if self.inputFriendsAccount(account):
            time.sleep(1)
            Log.debug("开始查找搜索按钮")
            # 点击搜索按钮
            if self.device(text="搜索:" + account, className="android.widget.TextView",
                        resourceId="com.tencent.mm:id/jn").click_exists(timeout=10.0):
                return True
            else:
                Log.error("无法找到搜索按钮")
        return False

    # 读取用户信息
    def readUserInfo(self, account):
        try:
            # 头像框
            # avatarUIObject = self.device(className="android.widget.ImageView", resourceId="com.tencent.mm:id/qi", description="头像")
            # avatarUIObject.click()#预览头像
            # self.device.screenshot("account.png")#截屏
            # self.device.click(100,100)#关闭头像预览

            nickNameText = ""
            # 昵称
            nickNameUIObject = self.device(className="android.widget.TextView", resourceId="com.tencent.mm:id/qj")
            if nickNameUIObject:
                nickNameInfo = nickNameUIObject.info
                if nickNameInfo:
                    nickNameText = nickNameInfo["text"]
                    # Logger.debug(nickNameText)

            sexText = ""
            # 性别
            sexUIObject = self.device(className="android.widget.ImageView", resourceId="com.tencent.mm:id/apl")
            if sexUIObject:
                sexInfo = sexUIObject.info
                if sexInfo:
                    sexText = sexInfo["contentDescription"]

            Log.debug(account + "\t" + nickNameText if nickNameText else "" + "\t" + sexText if sexText else "")
        finally:
            pass

    # 点击添加到通讯录
    # 使用watcher实现

    # 输入验证申请
    def inputValidationMessage(self, validationMessage):
        if self.device(className="android.widget.EditText", resourceId="com.tencent.mm:id/d4h").wait():
            uiObject = self.device(className="android.widget.EditText", resourceId="com.tencent.mm:id/d4h")
            uiObject.click()
            self.device.set_fastinput_ime(True)  # 切换成FastInputIME输入法
            self.device.clear_text()  # 清除输入框所有内容(Require android-uiautomator.apk version >= 1.0.7)
            self.device.send_keys(validationMessage)  # adb广播输入
            return True
        else:
            Log.debug("无法找到验证信息输入框")
            return False

    # 点击'添加到通讯录'按钮
    def clickAddToContact(self):

        if self.device(text="添加到通讯录", className="android.widget.Button",
                               resourceId="com.tencent.mm:id/ap0").click_exists(timeout=10.0):
            return True
        else:
            Log.error("无法找到'添加到通讯录'按钮")
            return False

    # 点击'发送'按钮
    def clickSendButton(self):
        if self.device(className="android.widget.TextView", resourceId="com.tencent.mm:id/hg").click_exists(timeout=10.0):
            return True
        else:
            Log.error("无法找到'发送按钮'")
            return False

    # 判断点击搜索用户后界面是否显示'该用户不存在'/'操作过于频繁，请稍后再试'
    def isCanNotFindUser(self):
        if self.device(text="详细资料", className="android.widget.TextView", resourceId="android:id/text1").wait(3):
            return False
        return True
        # if self.device(text="该用户不存在", className="android.widget.TextView", resourceId="com.tencent.mm:id/bcj").wait(3):
        #     return True
        # elif self.device(text="被搜帐号状态异常，无法显示", className="android.widget.TextView", resourceId="com.tencent.mm:id/bcj").wait(3):
        #     return True
        # return False

    # 判断点击搜搜用户后该用户是否已经添加
    def isUserAdded(self):
        if self.device.exists(text="发消息", className="android.widget.Button"):
            return True
        return False

    # 激活设置标签界面
    def activeSetupTagAndMemoWindow(self):
        if self.device(text="设置备注和标签", className="android.widget.TextView", resourceId="com.tencent.mm:id/aq0").click_exists(timeout=3.0):
            return True
        else:
            # 输入过标签的用户会显示为"标签"
            if self.device(className="android.widget.FrameLayout",
                                   resourceId="com.tencent.mm:id/aq3").click_exists(timeout=3.0):
                return True
        Log.error("无法找到'设置备注和标签'按钮")
        return False

    # 设置备注名
    def inputMemo(self, memo):
        if self.device(className="android.widget.EditText", resourceId="com.tencent.mm:id/d4l").click_exists(timeout=3.0):
            self.device.set_fastinput_ime(True)  # 切换成FastInputIME输入法
            self.device.clear_text()  # 清除输入框所有内容(Require android-uiautomator.apk version >= 1.0.7)
            self.device.send_keys(memo)  # adb广播输入
            return True
        else:
            if self.device(className="android.widget.EditText", resourceId="com.tencent.mm:id/arc").click_exists(timeout=3.0):
                self.device.set_fastinput_ime(True)  # 切换成FastInputIME输入法
                self.device.clear_text()  # 清除输入框所有内容(Require android-uiautomator.apk version >= 1.0.7)
                self.device.send_keys(memo)  # adb广播输入
                return True
        Log.debug("无法找到备注输入框")
        return False

    # 输入标签
    def inputTag(self, tag):
        if len(tag) == 0:
            return True
        actived = False
        # 找到标签控件
        # 激活，进入输入状态
        if self.device(className="android.widget.TextView", resourceId="com.tencent.mm:id/arh").click_exists(timeout=3.0):
            actived = True
        else:
            # 激活，进入输入状态
            if self.device(className="android.view.View", resourceId="com.tencent.mm:id/ari").click_exists(timeout=3.0):
                actived = True

        if actived:
            #有可能已经激活了键盘
            # if self.device(resourceId="com.tencent.mm:id/hz").wait(3):
            #     self.device(resourceId="com.tencent.mm:id/hz").click()

            self.device.set_fastinput_ime(True)  # 切换成FastInputIME输入法
            self.device.clear_text()  # 清除输入框所有内容(Require android-uiautomator.apk version >= 1.0.7)
            self.device.send_keys(tag)  # adb广播输入

            # 保存
            if self.device(text="保存", className="android.widget.TextView",
                                   resourceId="com.tencent.mm:id/hg").click_exists(timeout=10.0):
                return True
            else:
                self.device.press("back")
                Log.error("无法找到'标签'的'保存'按钮")
                return False

        else:
            Log.error("无法激活'输入标签'界面")
        return False

    #点击设置备注名的保存按钮
    def saveTagAndMemo(self):
        if self.device(text="保存", className="android.widget.TextView", resourceId="com.tencent.mm:id/hg").click_exists(timeout=10.0):
            return True
        return False

    # 添加到通讯录
    def addContact(self, lineData):

        # 有可能用户不存在
        if not self.isCanNotFindUser():
            # 是否已经添加
            if not self.isUserAdded():

                self.readUserInfo(lineData.account)

                # 标签、备注属于可选，在用户信息界面输入是因为有的微信号不需要验证
                if len(lineData.tag) > 0 or len(lineData.memo) > 0:
                    # 进入设置备注和标签的界面
                    if self.activeSetupTagAndMemoWindow():
                        time.sleep(1)

                        if len(lineData.memo) > 0:
                            # 输入备注
                            self.inputMemo(lineData.memo)
                        if len(lineData.tag) > 0:
                            # 输入标签
                            self.inputTag(lineData.tag)

                        # 点击保存按钮
                        self.saveTagAndMemo()

                # 点击添加到通讯录
                if self.clickAddToContact():
                    time.sleep(2)
                    # 输入验证信息
                    if lineData.validationMessage and len(lineData.validationMessage) > 0:
                        self.inputValidationMessage(lineData.validationMessage)
                    # 点击'发送'
                    if self.clickSendButton():
                        self.device(text= "已发送").wait()
                        # 后退，重新输入微信号继续搜索
                        self.device.press("back")
                        time.sleep(2)
                        self.device.press("back")
                        return 0
                    else:
                        return 6
                else:
                    # Log.error("无法点击添加到通讯录按钮")
                    return 3
            else:
                Log.debug("该用户已存在")
                self.device.press("back")
                time.sleep(1)
                self.device.press("back")
                return 1
        else:
            Log.debug("该用户不存在")
            self.device.press("back")
            time.sleep(1)
            return 2
